/**
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用
 */

// 处理 mysql 数据库里面的的表
const db = require('../db/index')
const bcrypt = require('bcryptjs')
// 用这个包来生成 Token 字符串
const jwt = require('jsonwebtoken')
// 导入配置文件
const config = require('../config')


// 根据用户的openid来判断数据库是否有该用户，没有则新建、登录，有则直接登录，均生成token
exports.userCheck = async (req, res) => {
	let connection; // 声明 connection 变量
	try {
		// 等待从连接池中获取一个连接
		connection = await db.getConnection();
		// 接收表单数据
		const {
			openid
		} = req.body;
		// return res.json({userName, password})

		// 检查用户是否已存在
		const checkSqlByOpenid =  `SELECT * FROM cc_user WHERE openid = ?`
		let [rows] = await connection.execute(checkSqlByOpenid, [openid]);
		if (!rows.length) {//如果没有，则新建
			let name = '用户' + Math.floor(10000000 + Math.random() * 90000000).toString();
			let insertUserSql = `insert into cc_user (openid, name) VALUES (?, ?)`
			await connection.execute(insertUserSql, [openid, name]);
			// 插入完再查一遍，确保有用户信息
			[rows] = await connection.execute(checkSqlByOpenid, [openid]);
		}

		// 处理登录
		const expiresIn = 10; //7天 
		// 生成 Token 字符串
		const tokenStr = jwt.sign(rows[0], config.jwtSecretKey, {
			expiresIn: expiresIn
		});
		//过期具体时间
		const expiresAt = new Date(Date.now() + 5 * 1000); //7d = 24 * 7 * 60 * 60 * 1000

		// 返回结果
		res.json({
			status: 200,
			message: '登录成功！',
			token: `Bearer ${tokenStr}`,
			expiresAt: expiresAt,
			data: rows[0]
		});


	} catch (err) {
		console.error('Database connection error:', err);
		res.status(500).json({
			status: 500,
			message: '数据库连接错误'
		});
	} finally {
		// 释放连接
		if (connection) {
			connection.release();
		}
	}
};



// 登录的处理函数
exports.login = async (req, res) => {
	let connection; // 声明 connection 变量
	try {
		// 等待从连接池中获取一个连接
		connection = await db.getConnection();
		const {
			userName,
			password
		} = req.body
		// console.log(userName)
		const sql = `SELECT * FROM cc_admin WHERE userName = ?`;

		// 查询
		const [results] = await connection.query(sql, [userName]);
		if (results.length !== 1) {
			return res.cc('没有此账号');
		}

		// 异步比较密码
		const isMatch = await bcrypt.compare(password, results[0].password);

		if (!isMatch) {
			return res.status(401).json({
				message: '用户名或密码错误'
			});
		}

		// 剔除密码和其他敏感信息
		const users = {
			...results[0],
			password: '',
			qqhao: '',
			archan: ''
		};

		const expiresIn = "1d"; //10s   2天后是2 days
		// 生成 Token 字符串
		const tokenStr = jwt.sign(users, config.jwtSecretKey, {
			expiresIn: expiresIn
		});
		//过期具体时间
		const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000 + 8 * 60 * 60 *
			1000); //1d = 24 * 60 * 60 * 1000   额外要补上8个小时

		// 返回结果
		const resultdata = {
			...results[0],
			password: '************'
		};

		res.send({
			status: 200,
			message: '登录成功！',
			token: `Bearer ${tokenStr}`,
			expiresAt: expiresAt,
			data: resultdata
		});
	} catch (err) {
		console.error(err);
		res.cc(err);
	} finally {
		// 释放连接
		if (connection) {
			connection.release();
		}
	}
};

//根据token查询用户信息
exports.getUserInfo = async (req, res) => {
	const token = req.headers.authorization.split(' ')[1]; // 从请求参数中获取 token,移除前缀
	if (!token) {
		return res.json({
			code: 400,
			message: 'No token provided'
		});
	}
	let connection; // 声明 connection 变量
	try {
		// 等待从连接池中获取一个连接
		connection = await db.getConnection();
		const decodedToken = jwt.verify(token, config.jwtSecretKey);
		const userId = decodedToken.id;
		// 查询数据库
		const sql = "select * from cc_admin where id = ?"
		const [user] = await connection.execute(sql, [userId]);
		user[0].password = '******************'
		res.json(user);
	} catch (error) {
		res.json({
			code: 401,
			message: '根据token获取用户信息失败'
		});
	} finally {
		// 释放连接
		if (connection) {
			connection.release();
		}
	}
};


//查验token
exports.checkToken = (req, res, next) => {
	const token = req.headers.authorization.split(' ')[1];

	try {
		const decoded = jwt.verify(token, secret);
		const expiration = decoded.exp * 1000; // 转换为毫秒
		const currentTime = Date.now();
		const remainingTime = expiration - currentTime;

		req.remainingTime = remainingTime; // 添加剩余时间到请求对象
		next();
	} catch (error) {
		res.status(401).json({
			message: 'Token 验证失败',
			error: error.message
		});
	}
}
